/**
 * bsw_endian.h
 * 完整整型和非完整整型的字节序转换实现，
 * 非完整整型如 3，5，6，7 字节整型的字节序转换
 *
 * 这可能对以字节序比较和空间节省十分有用，如
 * 小端机器上对“ANYCHARPREFIX+3字节整型”的有序存储
 * ---------------------------------------------
 * ANYCHARPREFIX+0（的二进制）
 * ANYCHARPREFIX+1（的二进制）
 * ...
 * ANYCHARPREFIX+ffffff（的二进制）
 *
 * 在前缀任意变更，数据量较大时，对比
 * 通过 ntohl/htonl 转换四字节整型后存储
 * 通过将 3 字节整型值转换为 6 字节字符串后存储
 * 空间更节省。
 *
 * 竹影半墙
 * 2023.09
 */
#ifndef BSW_ENDIAN_H
#define BSW_ENDIAN_H

#include <string.h>

/**
 * 对 @p 所指整型 [@s, @e) 字节区间进行字节序转换
 * 如 bsw_endian_swap(0, 3, &i); 可对整型 uint32_t i 低 3 
 * 字节进行转换
 */
static bsw_inline void bsw_endian_swap(int s, int e, void *p)
{
    char *a = (char *)p;

    while (s < --e) {
        a[s] = a[s] ^ a[e];
        a[e] = a[s] ^ a[e];
        a[s] = a[s] ^ a[e];
        s += 1;
    }
    return ;
}

/**
 * 对 @p 所指整型 [@s, @e) 字节区间进行字节序转换
 * 将转换结果拷贝到 @buf 中
 */
static bsw_inline void 
bsw_endian_swap_copy(void *buf, int s, int e, void *p)
{
    bsw_endian_swap(s, e, p);
    memcpy(buf, (char*)p+s, e-s);
    return ;
}

#endif